package cn.com.easy.weixin.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;

import com.github.sd4324530.fastweixin.api.OauthAPI;
import com.github.sd4324530.fastweixin.api.config.ApiConfig;
import com.github.sd4324530.fastweixin.api.response.GetUserInfoResponse;
import com.github.sd4324530.fastweixin.api.response.OauthGetTokenResponse;

/**
 * 微信授权跳转基础控制，在这里接收code
 * 
 * @author nibili 2017年5月11日
 * 
 */
public abstract class WeixinAuthRedirectBaseController {

	/**
	 * 微信配置
	 * 
	 * @param request
	 * @return
	 * @author nibili 2017年5月11日
	 */
	public abstract ApiConfig getApiConfig(HttpServletRequest request);

	/**
	 * 是否获取用户信息<br/>
	 * 如果为true,会调用 requestUserInfoSuccess方法
	 * 
	 * @return
	 * @author nibili 2017年5月11日
	 */
	public abstract boolean isGetUserInfo();

	/**
	 * 获取用户信息
	 * 
	 * @param getUserInfoResponse
	 * @param state
	 * @param request
	 * @author nibili 2017年5月11日
	 */
	public abstract void requestUserInfoSuccess(GetUserInfoResponse getUserInfoResponse, String state, HttpServletRequest request);

	/**
	 * 获取access_token、openId、unionId等成功后的回调
	 * 
	 * @param tokenResponse
	 * @param state
	 * @param request
	 * @author nibili 2017年5月11日
	 */
	public abstract void requestAccessTokenSuccess(OauthGetTokenResponse tokenResponse, String state, HttpServletRequest request);

	/**
	 * 微信授权跳转回调接收
	 * 
	 * @param request
	 * @param response
	 * @param code
	 * @param state
	 * @return
	 * @author nibili 2017年5月11日
	 */
	@RequestMapping("/weixin/oauth/redirect")
	public void oauthRedirect(HttpServletRequest request, HttpServletResponse response, String code, String state) {
		OauthAPI oauthAPI = new OauthAPI(getApiConfig(request));
		OauthGetTokenResponse tokenResponse = oauthAPI.getToken(code);
		// 获取token成功
		requestAccessTokenSuccess(tokenResponse, state, request);
		if (isGetUserInfo() == true) {
			GetUserInfoResponse getUserInfoResponse = oauthAPI.getUserInfo(tokenResponse.getAccessToken(), tokenResponse.getOpenid());
			// 获取用户信息成功
			requestUserInfoSuccess(getUserInfoResponse, state, request);
		}
	}
}
